﻿using System;
using System.Threading;
using System.Windows.Forms;
using l1cs_cl.client;
using l1cs_cl.client.receivepackets;
using l1cs_cl.client.transferpackets;
using l1cs_cl.client.utils;
using System.Xml;
using MySql.Data.MySqlClient;
using System.Data;

namespace l1cs_cl
{
    public partial class frmL1cscl : Form
    {
        // パケット読み込みスレッド
        private Thread thread;

        //private static frmL1cscl _Instance;
        //public static frmL1cscl Instance
        //{
        //    get
        //    {
        //        if ( _Instance == null || _Instance.IsDisposed )
        //            _Instance = this;
        //        return _Instance;
        //    }
        //}

        public static R_LoginResult pLoginResult;
        public static R_CommonNews pCommonNews;

        public frmL1cscl()
        {
            InitializeComponent();
        }

        // ログインボタン
        private void btnLogin_Click( object sender, EventArgs e )
        {
            if ( !PlayerThread.Instance.connect( txtServer.Text ) )
            {
                stlStatus.Text = "サーバーと接続に失敗。";
                return;
            }
            else
            {
                stlStatus.Text = "サーバーと接続しました。";
            }
            Thread.Sleep( 100 );

            // 最初のパケット受信
            byte[] readdata = PlayerThread.readPacketNoTry();

            if ( readdata == null || readdata[0] != 0x7d )
            {
                MessageBox.Show( "最初のパケットが無効なものです。" +
                    ByteArrayUtil.dumpToString( readdata ) );
                return;
            }

            // クライアントバージョン送信
            byte[] sendData = new byte[] { 0x22, 0x33, 0x59, 0x44, 0xe3, 0x00, 0xe0, 0xb9, 0x46, 0x3d };
            //byte[] ClientVersion2 = new byte[] { 0x84, 0xde, 0xbb, 0xb5, 0x9b, 0xa0, 0xc2, 0x6b, 0x6e, 0x56, 0x48, 0x0e };
            PlayerThread.SendPackets( sendData );

            // サーババージョン受信
            readdata = PlayerThread.readPacketNoTry();
            if ( readdata[0] != Opcodes.S_OPCODE_SERVERVERSION )
            {
                MessageBox.Show( "サーババージョンパケットではなかったです。" +
                    ByteArrayUtil.dumpToString( readdata ) );
                return;
            }
            Thread.Sleep( 100 );

            // ログインパケット送信
            T_LoginPacket tLoginpacket = new T_LoginPacket( txtUsername.Text, txtPassword.Text );
            PlayerThread.SendPackets( tLoginpacket.getBytes() );

            // パケット読み込みスレッドの開始
            //thread = new Thread( new ThreadStart( PlayerThread.Instance.readThread ) );
            //thread.Name = "PlayerThread";
            //thread.IsBackground = true;
            //thread.Start();

            // ログイン結果受信
            R_LoginResult pLoginResult = new R_LoginResult( PlayerThread.readPacketNoTry() );
            stlStatus.Text = pLoginResult.sStatus;
            if ( pLoginResult.stateLogin > 0 )
            {
                stlStatus.Text = "ログインに失敗しました。";
                return;
            }

            // 告知情報取得
            R_CommonNews pCommonNews = new R_CommonNews( PlayerThread.readPacketNoTry() );
            if ( pCommonNews.sCommonNews == null )
            {
                MessageBox.Show( "告知情報の取得に失敗しました。" );
                return;
            }
            // 親ウィンドウの中央に設定
            frmAnnouncements.Instance.StartPosition = FormStartPosition.CenterParent;
            frmAnnouncements.Instance.rtbAnnouncements.Text = pCommonNews.sCommonNews;
            frmAnnouncements.Instance.ShowDialog();

            // 告知情報クリック
            T_CommonClick tCommonClick = new T_CommonClick();
            PlayerThread.SendPackets( tCommonClick.getBytes() );
            frmSelectCharacter.Instance.StartPosition = FormStartPosition.CenterParent;
            frmSelectCharacter.Instance.ShowDialog();

            // パケット読み込みスレッドの開始
            thread = new Thread( new ThreadStart( PlayerThread.Instance.readThread ) );
            thread.Name = "PlayerThread";
            thread.IsBackground = true;
            thread.Start();
        }

        // フォームを閉じる前の処理
        private void frmL1cscl_FormClosing( object sender, FormClosingEventArgs e )
        {
            // ネットワークの切断
            PlayerThread.Instance.disconnect();

            // スレッドの停止
            if ( thread != null )
            {
                thread.Abort();
            }

            // フォームの位置等を記録
            Properties.Settings.Default.Save();
        }

        // ログアウトボタンの処理
        private void btnLogout_Click( object sender, EventArgs e )
        {
            T_QuitGame tQuitGame = new T_QuitGame();
            PlayerThread.SendPackets( tQuitGame.getBytes() );
            Thread.Sleep( 1000 );
            //閉じる
            PlayerThread.Instance.disconnect();
        }

        // フォームを表示する前の処理
        private void frmL1cscl_Load( object sender, EventArgs e )
        {
            //PlayerThread.Instance.;
            //frmAnnouncements.getInstance();
            //frmNewCharacter.getInstance();
            //frmSelectCharacter.getInstance();
        }

        // ステータスバーに状態を設定する
        public void setStatusBar( String str )
        {
            stlStatus.Text = str;
        }

        private void btnDB2Xml_Click( object sender, EventArgs e )
        {
            String _connstr = string.Format(
                "userid={0};password={1};database={2};Host={3};Character Set=sjis",
                "root", "zoi5902", "l1jdb", "localhost" );
            String sqlstr = "select * from etcitem";
            MySqlConnection con = new MySqlConnection( _connstr );
            con.Open();
            MySqlDataAdapter da = new MySqlDataAdapter( sqlstr, con );
            DataTable dt = new DataTable();
            da.Fill( dt );
            con.Close();

            XmlDocument xd = new XmlDocument();
            // XML宣言作成
            XmlDeclaration xmd = xd.CreateXmlDeclaration( "1.0", "Shift-jis", "yes" );
            xd.AppendChild( xmd );
            // ルートノード作成
            XmlElement root = xd.CreateElement( "root" );
            XmlNode xn1, xn2;
            XmlCharacterData xt;
            // 子ノード作成
            xn1 = xd.CreateNode( XmlNodeType.Element, "item", "" );
            foreach ( DataRow dr in dt.Rows )
            {
                // 孫ノード作成
                xn2 = xd.CreateNode( XmlNodeType.Element, "unidentified_name_id", "" );
                xt = xd.CreateTextNode( dr["unidentified_name_id"] as String );
                xn2.AppendChild( xt );
                xn1.AppendChild( xn2 );
                xn2 = xd.CreateNode( XmlNodeType.Element, "name", "" );
                xt = xd.CreateTextNode( dr["name"] as String );
                xn1.AppendChild( xt );
                xn1.AppendChild( xn2 );
            }
            root.AppendChild( xn1 );
            xd.AppendChild( root );
            xd.Save( "test.xml" );
        }
    }
}
